//
//  LWEmoticonCollectionViewCell.swift
//  LW_Weibo
//
//  Created by 刘伟 on 16/7/20.
//  Copyright © 2016年 LWSpro. All rights reserved.
//

import UIKit

//列数
private let colNums = 7

//行数
private let rowNums = 3

//每个cell上有20个按钮
private let numbersOfButton = numbersOfPage

//表情视图cell
class LWEmoticonCollectionViewCell: UICollectionViewCell {
    
    //存储表情按钮的数组  好/对按钮布局
    private var emoticonBtnArr: [LWEmoticonButton] = [LWEmoticonButton]()
    
    
    private lazy var deleteEmoticonButton: UIButton = {
        
        let button = UIButton()
        
        //添加点击事件
        button.addTarget(self, action: "deleteEmoticonButtonAction", forControlEvents: .TouchUpInside)
        
        //  设置图片
        button.setImage(UIImage(named: "compose_emotion_delete"), forState: .Normal)
        button.setImage(UIImage(named: "compose_emotion_delete_highlighted"), forState: .Highlighted)

        return button
        
    }()
    
    //MARK: - 模型数组
    var emoticonsArr: [LWEmoticon]? {
        
        didSet {
            
            //根据模型数组来确定button显示的个数 不要根据按钮数组来确定button  因为有些并不显示20个button
            
            guard let ets = emoticonsArr else {
                
                print("传过来的是空数组,无法解包")
                
                return
                
            }
            
            //先隐藏所有按钮  然后我们再去根据传过来的数组中的元素个数 来确定要显示的按钮
            //先隐藏按钮的原因是 cell的重用,如果不隐藏 那么当cell重用的时候,有些cell上面的按钮个数可能只有几个 但因为重用 cell上的那些没有按钮的地方也会显示有按钮(从缓存池中取出来的cell上本就有20个按钮 cell重用就是对cell重新赋值内容)
            for value in emoticonBtnArr { //隐藏全部按钮  那么肯定是直接从按钮数组中取按钮 在全部隐藏
                
                value.hidden = true
                
            }
            
            
            //下面我们根据传过来的数组 来确定要显示多少按钮
            for (i, value) in ets.enumerate() {
                
                //根据传进来的数组索引取到按钮数组中的按钮
                let button = emoticonBtnArr[i]
                //显示button
                button.hidden = false
                
                //将传过来的模型数组中的模型给每一个表情按钮赋值
                button.emoticon = value
                
                //判断是图片还是emoji表情
                if value.type == "0" {
                    
                    
                    //设置图片
                    button.setImage(UIImage(named: value.path!), forState: .Normal)
                    
                    //因为emoji表情实际上是文字  所以当只是图片的时候 我们要让文字为nil  不然cell重用的时候就会又显示文字又显示图片
                    
                    button.setTitle(nil, forState: .Normal)
                    
                    
                }else {//传进来的是emoji表情  需要转码

                    //  设置emoji  转码导入第三方框架
                    button.setTitle((value.code! as NSString).emoji(), forState: .Normal)
                    
                    //让图片为nil
                    button.setImage(nil, forState: .Normal)
                    
                    
                    
                }
                
                
            }
            
        }
        
    }
    
    
    
    
    override init(frame: CGRect) {
        
        super.init(frame: frame)
        
        addChildBtn()
        
        
    }

    
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
        
    }
    
    
    //创建button
    private func addChildBtn() {
        
        for _ in 0..<numbersOfButton {
            
            let button = LWEmoticonButton()
            
            //  添加点击事件
            button.addTarget(self, action: "emoticonButtonAction:", forControlEvents: .TouchUpInside)

            
            button.titleLabel?.font = UIFont.systemFontOfSize(34)
            
            //添加到cell上
            contentView.addSubview(button)

            //存到按钮数组中  为了后面的布局
            emoticonBtnArr.append(button)
            
            
        }
        
        
    }
    
    
    
    //MARK: - 对按钮布局
    //要对按钮布局 需要拿到cell的宽高 这个方法能拿到准确值
    override func layoutSubviews() {
        
        super.layoutSubviews()
        
        
        //计算宽高  width = self.width 当前cell的宽
        let btnW = width / CGFloat(colNums)
        
        let btnH = height / CGFloat(rowNums)
        
        for (i, button) in emoticonBtnArr.enumerate() {
            
            //计算列和行的索引
            let colIndex = i % Int(colNums)
            let rowIndex = i / Int(colNums)
            
            //  设置大小
            button.size = CGSize(width: btnW, height: btnH)
            //  设置x坐标
            button.x = CGFloat(colIndex) * btnW
            //  设置y坐标
            button.y = CGFloat(rowIndex) * btnH
            
            
        }
        
        
        //给删除按钮布局
        deleteEmoticonButton.size = CGSize(width: btnW, height: btnH)

        deleteEmoticonButton.x = self.width - btnW
        
        deleteEmoticonButton.y = self.height - btnH
        
        
    }
    
    
    
    
    //MARK: - 表情按钮的点击事件
    
    //像这种表情按钮所在的cell和textView之间隔离好多层级(界面)使用通知要简便得多
    //点击表情按钮  发送通知 让控制器接收通知,来为textView赋值表情 (也可以让textView接收通知,但不要这么做,就让textView所在的控制器来实现)
    @objc private func emoticonButtonAction(button: LWEmoticonButton) { //button 就是我们点击的那个表情按钮
        
        //要将每个表情按钮的模型传过去 也可以将每个按钮传过去 但我们最终也只是通过按钮拿到模型 所以就传每个按钮对应的模型
        let emoticon = button.emoticon!
        
        //发送通知
        NSNotificationCenter.defaultCenter().postNotificationName(ClickSeletedEmotionButtonNotification, object: emoticon)
   
    }
    
    
    // MARK:    - 删除按钮的点击事件
    //发送通知,让控制器接收
    @objc private func deleteEmoticonButtonAction() {
        
        //发送通知
        NSNotificationCenter.defaultCenter().postNotificationName(ClickSelecteDeleteEmoticonButtonNotification, object: nil)
        
    }
    
    
    
}
